package com.auntvt.timo.jpax.core.quick.interfaces;

import com.auntvt.timo.jpax.core.quick.enums.CriteriaType;

import java.io.Serializable;
import java.util.function.Consumer;

/**
 * 表关联查询条件接口
 *
 * @author 小懒虫 <auntvt@163.com>
 * @date 2021/7/31
 */
public interface JoinCriteria<Children, R> extends Serializable {

    /**
     * 表关联操作
     * <p>用法：join(i -> i.xx().xx())</p>
     *
     * @param condition 条件表达式
     * @param criteriaType 条件类型
     * @param fieldName 关联字段名
     * @param consumer  可使用箭头函数表达式
     * @return this
     */
    Children join(boolean condition, CriteriaType criteriaType, R fieldName, Consumer<Children> consumer);

    /**
     * 表关联操作-内连接INNER
     * <p>用法：join(i -> i.xx().xx())</p>
     *
     * @param condition 条件表达式
     * @param fieldName 关联字段名
     * @param consumer  可使用箭头函数表达式
     * @return this
     */
    default Children join(boolean condition, R fieldName, Consumer<Children> consumer) {
        return join(condition, CriteriaType.JOIN_INNER, fieldName, consumer);
    }

    /**
     * 表关联操作-内连接INNER
     * <p>用法：join(i -> i.xx().xx())</p>
     *
     * @param fieldName 关联字段名
     * @param consumer  可使用箭头函数表达式
     * @return this
     */
    default Children join(R fieldName, Consumer<Children> consumer) {
        return join(true, fieldName, consumer);
    }

    /**
     * 表关联操作-左连接LEFT
     * <p>用法：join(i -> i.xx().xx())</p>
     *
     * @param condition 条件表达式
     * @param fieldName 关联字段名
     * @param consumer  可使用箭头函数表达式
     * @return this
     */
    default Children joinLeft(boolean condition, R fieldName, Consumer<Children> consumer) {
        return join(condition, CriteriaType.JOIN_LEFT, fieldName, consumer);
    }

    /**
     * 表关联操作-左连接LEFT
     * <p>用法：join(i -> i.xx().xx())</p>
     *
     * @param fieldName 关联字段名
     * @param consumer  可使用箭头函数表达式
     * @return this
     */
    default Children joinLeft(R fieldName, Consumer<Children> consumer) {
        return joinLeft(true, fieldName, consumer);
    }

    /**
     * 表关联操作-右连接RIGHT
     * <p>用法：join(i -> i.xx().xx())</p>
     *
     * @param condition 条件表达式
     * @param fieldName 关联字段名
     * @param consumer  可使用箭头函数表达式
     * @return this
     */
    default Children joinRight(boolean condition, R fieldName, Consumer<Children> consumer) {
        return join(condition, CriteriaType.JOIN_RIGHT, fieldName, consumer);
    }

    /**
     * 表关联操作-右连接RIGHT
     * <p>用法：join(i -> i.xx().xx())</p>
     *
     * @param fieldName 关联字段名
     * @param consumer  可使用箭头函数表达式
     * @return this
     */
    default Children joinRight(R fieldName, Consumer<Children> consumer) {
        return joinRight(true, fieldName, consumer);
    }
}
